﻿using System.Collections;
using System.Collections.Generic;
//using Firebase.Analytics;
using UnityEngine;

public class 地图管理器 : MonoBehaviour
{
    public 玩家控制 m_当前玩家控制;
    //private static FirebaseAnalytics m_Firebase分析;

    List<List<地图物体描述>> m_地图信息 = new List<List<地图物体描述>>();

    public int m_玩家当前所在行 = 0;

    public 障碍方块 m_障碍预制;
    public 奖励点 m_奖励点预制;
    public 挡板 m_挡板预制;
    public static int m_游戏最大行数 = 3500;

    int 每行个数 = 5;

    public List<GameObject> m_地图对象缓存 = new List<GameObject>();

    public static 地图管理器 m_当前地图管理器;

    public List<Material> m_方块材质列表 = new List<Material>();

    public GameObject m_统计面板;
    public GameObject m_续命按钮;

    void Start ()
    {

        m_统计面板.SetActive(false);

        RenderSettings.fog = true;

        if (m_当前地图管理器 == null)
        {
            m_当前地图管理器 = this;
        }
        else
        {
            Debug.LogError("场景中仅能有一个[地图管理器]");
        }

       
        for (int i = 0; i< m_游戏最大行数; i++)
        {
            List<地图物体描述> m_地图行 = new List<地图物体描述>();

            int tmp随机数 = Random.Range(0, 10);


            if (i%2== 0)
            {
                //创建空行 
                List<地图物体描述> tmp行 = new List<地图物体描述>();

                for (int k = 0; k < 5; k++)
                {
                    tmp随机数 = Random.Range(0, 5);

                    if (tmp随机数 < 4)
                    {
                        tmp行.Add(new 地图物体描述() { 点数 = 0, 所在行 = i });
                    }
                    else
                    {
                        tmp行.Add(new 地图物体描述() { 点数 = Random.Range(0, 5), 所在行 = i });
                    }
                }

                /*挡板*/
                if (Random.Range(0, 10) < 5)
                {
                    tmp行[Random.Range(1, 5)].点数 = -2000;
                    tmp行[Random.Range(1, 5)].点数 = -2000;
                    m_地图行.AddRange(tmp行);
                }

            }
            else
            {
                if(tmp随机数<1)
                {
                    List<地图物体描述> tmp行 = new List<地图物体描述>();

                    for (int k = 0; k < 5; k++)
                    {
                        tmp随机数 = Random.Range(0, 10);

                        if (tmp随机数 < 5)
                        {
                            tmp行.Add(new 地图物体描述() { 点数 = Random.Range(-60, -20), 所在行 = i });
                        }
                        else
                        {
                            tmp行.Add(new 地图物体描述() { 点数 = Random.Range(-20, -1), 所在行 = i });
                        }
                    }

                    tmp行[Random.Range(0, 5)].点数 = Random.Range(-9, -1);

                    m_地图行.AddRange(tmp行);
                }
                else
                {
                    for (int k = 0; k < 5; k++)
                    {
                        tmp随机数 = Random.Range(0, 10);

                        if (tmp随机数 < 5)
                        {
                            m_地图行.Add(new 地图物体描述() { 点数 = 0, 所在行 = i });
                        }
                        else
                        {
                            if (tmp随机数 < 9)
                            {
                                m_地图行.Add(new 地图物体描述() { 点数 = Random.Range(-30, -1), 所在行 = i });
                            }
                            else
                            {
                                m_地图行.Add(new 地图物体描述() { 点数 = Random.Range(0, 6), 所在行 = i });
                            }
                        }
                    }
                }

                bool 出现死亡方块 = Random.Range(0, 100)%
                                    (int)(Mathf.Lerp(10f, 3f, 地图管理器.m_当前地图管理器.m_玩家当前所在行 / 50f))
                                    ==0;
                int 一行内死亡方块数 = 0;
                if (出现死亡方块)
                {
                    int tmp行内预定死亡方块数  = Random.Range(1, 
                                                     (int)(Mathf.Lerp(1f, 4f, 地图管理器.m_当前地图管理器.m_玩家当前所在行 / 50f))
                                                );
                    while(一行内死亡方块数 <= tmp行内预定死亡方块数)
                    {
                        int 第N个 = Random.Range(0, 100)%5;
                        var v = m_地图行[第N个];
                        if (v.点数 != 地图物体描述.常量_死亡数值)
                        {
                            v.点数 = 地图物体描述.常量_死亡数值;
                            一行内死亡方块数++;
                        }
                        else { continue; };
                    }

                }


            }


            m_地图信息.Add(m_地图行);
        }

        for (int i = m_游戏最大行数; i < m_游戏最大行数+30; i++)
        {
            List<地图物体描述> m_地图行 = new List<地图物体描述>();
            if (i >= m_游戏最大行数+18)
            {
                m_地图行.Add(new 地图物体描述() { 点数 = 地图物体描述.常量_死亡数值, 所在行 = i });
                m_地图行.Add(new 地图物体描述() { 点数 = 地图物体描述.常量_死亡数值, 所在行 = i });
                m_地图行.Add(new 地图物体描述() { 点数 = 地图物体描述.常量_死亡数值, 所在行 = i });
                m_地图行.Add(new 地图物体描述() { 点数 = 地图物体描述.常量_死亡数值, 所在行 = i });
                m_地图行.Add(new 地图物体描述() { 点数 = 地图物体描述.常量_死亡数值, 所在行 = i });
            }
            m_地图信息.Add(m_地图行);
        }



    }
	

	void Update ()
    {
		
	}

    public void 刷新地图(float 玩家位置)
    {
        if(玩家位置<0)
        {
            玩家位置 = 0;
        }

        m_玩家当前所在行 = (int)(玩家位置/1.05f);

        for(int i = 0;i<12;i++)
        {
            int k = 0;
            foreach(var v in m_地图信息[i+ m_玩家当前所在行])
            {
                if(!v.已经创建)
                {
                    if (v.点数 == 地图物体描述.常量_死亡数值)
                    {
                        障碍方块 tmp = Instantiate(m_障碍预制, new Vector3(k * 1.05f - 2f * 1.05f, 1, (i + m_玩家当前所在行) * 1.05f), Quaternion.identity);

                        tmp.m_所需点数 = (int)(Mathf.Abs(v.点数));
                        tmp.m_所在行 = v.所在行;
                        tmp.m_所在列 = k;
                        tmp.m_撞击后消失对象.GetComponent<Renderer>().material = m_方块材质列表[15];

                        m_地图对象缓存.Add(tmp.gameObject);
                    }
                    if (v.点数 > -1000 && v.点数 < 0)
                    {
                        障碍方块 tmp = Instantiate(m_障碍预制, new Vector3(k * 1.05f - 2f * 1.05f, 1, (i + m_玩家当前所在行) * 1.05f), Quaternion.identity);

                        tmp.m_所需点数 = (int)(Mathf.Abs(v.点数) * Mathf.Lerp(0.5f,1f, m_玩家当前所在行 / 200f));
                        tmp.m_所在行 = v.所在行;
                        tmp.m_所在列 = k;
                        int 十的倍数 = tmp.m_所需点数/10;
                        tmp.m_撞击后消失对象.GetComponent<Renderer>().material = m_方块材质列表[十的倍数% m_方块材质列表.Count];

                        m_地图对象缓存.Add(tmp.gameObject);
                    }

                    if (v.点数 == 0)
                    {
                        
                    }

                    if (v.点数 == -2000)
                    {
                        挡板 tmp = Instantiate(m_挡板预制, new Vector3(k * 1.05f - 2f * 1.05f, 0.8f, (i + m_玩家当前所在行) * 1.05f), Quaternion.identity);
                        tmp.m_所在行 = v.所在行;
                        m_地图对象缓存.Add(tmp.gameObject);
                    }

                    if (v.点数 > 0)
                    {
                        奖励点 tmp = Instantiate(m_奖励点预制, new Vector3(k * 1.05f - 2f * 1.05f, 1, (i + m_玩家当前所在行) * 1.05f), Quaternion.identity);
                        tmp.m_奖励点数 = Mathf.Abs(v.点数);
                        m_地图对象缓存.Add(tmp.gameObject);
                    }

                    v.已经创建 = true;
                }
                
                k++;
            }
        }

    }

    public void 清空地图()
    {

        foreach(var v in m_地图对象缓存)
        {
            if(v!=null)
            {
                Destroy(v);
            }
        }
        m_地图对象缓存.Clear();

    }
}
 
public class 地图物体描述
{
    public int 点数 = -1;
    public bool 已经创建 = false;
    public int 所在行 = 0;


    public const int 常量_死亡数值 = -99999;

}



